package main

import "fmt"

type TreeNode struct {
   Val int
   Left *TreeNode
   Right *TreeNode
}

// 前序遍历
func preOrder(root *TreeNode) {
   // 最小子问题
   if root == nil {
      return
   }
   // 遍历打印根节点
   fmt.Println(root.Val)
   // 遍历左子树
   preOrder(root.Left)
   // 遍历右子树
   preOrder(root.Right)
}

// 中序遍历
func inOrder(root *TreeNode) {
   // 最小子问题
   if root == nil {
      return
   }
   // 遍历左子树
   inOrder(root.Left)
   // 遍历打印根节点
   fmt.Println(root.Val)
   // 遍历右子树
   preOrder(root.Right)
}

// 后序遍历
func postOrder(root *TreeNode) {
   // 最小子问题
   if root == nil {
      return
   }
   // 遍历左子树
   postOrder(root.Left)
   // 遍历右子树
   postOrder(root.Right)
   // 遍历打印根节点
   fmt.Println(root.Val)
}

func main() {
   node5 := TreeNode{7, nil, nil}
   node4 := TreeNode{11, nil, nil}
   node3 := TreeNode{23, nil, nil}
   node2 := TreeNode{9, nil, &node5}
   node1 := TreeNode{8, &node3, &node4}
   root := TreeNode{10, &node1, &node2}

   preOrder(&root)
}